package firewall;
import java.util.ArrayList;
import java.util.List;

public class Firewall {
	private List<Regla> reglas = new ArrayList<Regla>();
	private List<Regla> reglasMatcheadas = new ArrayList<Regla>();
	
	public void agregarRegla(Regla regla){
		this.reglas.add(regla);
		
	}
	
	public void agregarReglas(ArrayList<Regla> reglas){
		this.reglas.addAll(reglas);
		
	}
	
	public void removerRegla(Regla regla){
		this.reglas.remove(regla);
		
	}
	
	public boolean evaluaPaquete(Paquete paquete){
		
		boolean matchea = this.ejecutarReglas(paquete);
		
		if (matchea){
			System.out.println("Paquete Aceptado");}
		else{
			System.out.println("Paquete Desechado");
		}
		
		return matchea;
	}
	
	
	
	public boolean ejecutarReglas(Paquete paquete){
		
		this.reglasMatcheadas.clear();
		
		boolean paqueteAceptado = true; 
		this.obtenerMatcheadas(paquete);
		
		for(int i = 0; i < this.reglasMatcheadas.size(); i++) {//Recorre las matcheadas y si es negadora la ejecuta. No me convence
			// que saber si es Negadora o no lo pregunte el Firewall, me gustar�a m�s que quede dentro del ejecutarAcciones
			// de la Regla, pero de alguna forma necesito saber si hay alguna negadora adentro para saber si el paquete se niega o no.
			try{
				this.reglasMatcheadas.get(i).ejecutarAcciones(paquete);
			}catch (EsNegadoraException e){
				paqueteAceptado=false;
			}catch (ForwardException e) {
				// Si hizo forward, vuelve a enviar el paquete por el firewall.
				paqueteAceptado = this.ejecutarReglas(paquete);
			}
		}
		
		return paqueteAceptado;
	}

	private void obtenerMatcheadas(Paquete paquete) {
		for(Regla regla: this.reglas){ //Recorre sus reglas viendo si alguna matchea. La que matchea se agrega a reglasMatecheadas
			if (regla.matchea(paquete)){
				this.reglasMatcheadas.add(regla);
			}
			
		}
	}

}
